package com.zero.guava.samples.FutureFallback;

import com.google.common.util.concurrent.FutureFallback;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.SettableFuture;

import java.io.FileNotFoundException;

/**
 * FutureFallback接口
 * 提供一个Future的备用来替代之前失败的Future;
 * 在Future实例失败后常被用来作为Future的备份或者默认的值;
 */
public class FutureFallbackTest {

    /**
     * 接下来简单的解释一下上面的示例:假设我们试图异步的检索文件的名称,但是没有找到,不过没有关系,
     * 我们首先判断了异常的类型,当捕获到找不到文件的异常时,我们通过SettableFuture构造了一个Future对象,
     * 并且将其值设置为"Not Found",然后将其返回,如果是其他的异常,我们可以继续传播此异常。
     */
    class  FutureFallbackImpl implements FutureFallback<String> {

        @Override
        public ListenableFuture<String> create(Throwable t) throws Exception {

            if (t instanceof FileNotFoundException) {
                SettableFuture<String> settableFuture = SettableFuture.create();
                settableFuture.set("Not Found");
                return settableFuture;
            }
            throw new Exception(t);
        }
    }

}
